package com.icen.utils.baidu.map;

import java.util.List;

import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.view.View;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;

public class BaiduMapUtils {
	private MapView mBaiduMapView = null;
	private BaiduMap mBaiduMap = null;

	private BaiduMapUtils(MapView mapView) {
		this.mBaiduMapView = mapView;
		if (mBaiduMapView != null) {
			mBaiduMap = mBaiduMapView.getMap();
		}
	}

	private static BaiduMapUtils mBaiduUtils = null;

	public static BaiduMapUtils getInstance(MapView mapView) {
		//if (mBaiduUtils == null) {
			mBaiduUtils = new BaiduMapUtils(mapView);
		//}
		return mBaiduUtils;
	}

	/**
	 * 获取百度地图实例
	 * 
	 * @return BaiduMap
	 */
	public BaiduMap getBaiduMap() {
		return mBaiduMap;
	}

	// #####################################################
	//
	// -------------------百度地图定位模式------------------
	//
	// #####################################################

	/**
	 * 设置定位模式:罗盘模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param view
	 */
	public void setLocModeToCompass(boolean isEnableDir, View view) {
		this.setLocModeByView(LocationMode.COMPASS, isEnableDir, view);
	}

	/**
	 * 设置定位模式:罗盘模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param resource
	 */
	public void setLocModeToCompass(boolean isEnableDir, int resource) {
		this.setLocModeByResuorce(LocationMode.COMPASS, isEnableDir, resource);
	}

	/**
	 * 设置定位模式:跟随模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param view
	 */
	public void setLocModeToFollow(boolean isEnableDir, View view) {
		this.setLocModeByView(LocationMode.FOLLOWING, isEnableDir, view);
	}

	/**
	 * 设置定位模式:跟随模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param resource
	 */
	public void setLocModeToFollow(boolean isEnableDir, int resource) {
		this.setLocModeByResuorce(LocationMode.FOLLOWING, isEnableDir, resource);
	}

	/**
	 * 设置定位模式:普通模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param view
	 */
	public void setLocModeToNormal(boolean isEnableDir, View view) {
		this.setLocModeByView(LocationMode.NORMAL, isEnableDir, view);
	}

	/**
	 * 设置定位模式:普通模式
	 * 
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param resource
	 */
	public void setLocModeToNormal(boolean isEnableDir, int resource) {
		this.setLocModeByResuorce(LocationMode.NORMAL, isEnableDir, resource);
	}

	private void setLocModeByView(LocationMode locMode, boolean isEnableDir,
			View view) {
		BitmapDescriptor bitmapDes = BitmapDescriptorFactory.fromView(view);
		this.setLocMode(locMode, isEnableDir, bitmapDes);
	}

	private void setLocModeByResuorce(LocationMode locMode,
			boolean isEnableDir, int resource) {
		BitmapDescriptor bitmapDes = BitmapDescriptorFactory
				.fromResource(resource);
		this.setLocMode(locMode, isEnableDir, bitmapDes);
	}

	/**
	 * 设置定位模式
	 * 
	 * @param locMode
	 *            定位模式
	 * @param isEnableDir
	 *            是否允许显示方向信息
	 * @param bitmapDes
	 */
	public void setLocMode(LocationMode locMode, boolean isEnableDir,
			BitmapDescriptor bitmapDes) {
		MyLocationConfiguration locConfig = new MyLocationConfiguration(
				locMode, isEnableDir, bitmapDes);
		if (mBaiduMap != null) {
			mBaiduMap.setMyLocationConfigeration(locConfig);
		}
	}

	// #################################################
	//
	// -------------------百度地图弹窗------------------
	//
	// #################################################

	/**
	 * 地图弹窗
	 * 
	 * @param bitmapDes
	 * @param latLng
	 * @param yOffset
	 *            偏移量
	 * @param onClick
	 */
	public void setInfoWindow(BitmapDescriptor bitmapDes, LatLng latLng,
			int yOffset, OnInfoWindowClickListener onClick) {
		InfoWindow infoWindow = new InfoWindow(bitmapDes, latLng, yOffset,
				onClick);
		this.showInfoWin(infoWindow);
	}

	/**
	 * 地图弹窗
	 * 
	 * @param view
	 * @param latLng
	 * @param yOffset
	 *            偏移量
	 * @param onClick
	 */
	public void setInfoWindow(View view, LatLng latLng, int yOffset,
			OnInfoWindowClickListener onClick) {
		BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);
		InfoWindow infoWindow = new InfoWindow(bitmap, latLng, yOffset, onClick);
		this.showInfoWin(infoWindow);
	}

	/**
	 * 地图弹窗
	 * 
	 * @param view
	 * @param latLng
	 * @param yOffset
	 *            偏移量
	 */
	public void setInfoWindow(View view, LatLng latLng, int yOffset) {
		InfoWindow infoWindow = new InfoWindow(view, latLng, yOffset);
		this.showInfoWin(infoWindow);
	}

	private void showInfoWin(InfoWindow infoWindow) {
		if (mBaiduMap != null) {
			mBaiduMap.showInfoWindow(infoWindow);
		}
	}

	// ###################################################
	//
	// -------------------百度地图覆盖物------------------
	//
	// ###################################################

	public void setOverlayByPolyline(List<LatLng> latLngList, int color,
			int width, int zIndex) {
		PolylineOptions pOptions = new PolylineOptions();
		pOptions.points(latLngList);
		pOptions.color(color);
		pOptions.width(width);
		pOptions.zIndex(zIndex);

		if (mBaiduMap != null) {
			mBaiduMap.addOverlay(pOptions);
		}
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param resource
	 * @param lat
	 * @param lng
	 */
	public void setOverlay(int resource, LatLng latLng) {
		this.setOverlay(resource, latLng, null);
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param resource
	 * @param lat
	 * @param lng
	 * @param info
	 */
	public void setOverlay(int resource, LatLng latLng, Bundle info) {
		BitmapDescriptor bitmap = BitmapDescriptorFactory
				.fromResource(resource);
		this.setOverlay(bitmap, latLng, info);
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param view
	 * @param lat
	 * @param lng
	 */
	public void setOverlay(View view, LatLng latLng) {
		this.setOverlay(view, latLng, null);
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param view
	 * @param lat
	 * @param lng
	 * @param info
	 */
	public void setOverlay(View view, LatLng latLng, Bundle info) {
		BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);
		this.setOverlay(bitmap, latLng, info);
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param bitmapDes
	 * @param latLng
	 */
	public void setOverlay(BitmapDescriptor bitmapDes, LatLng latLng) {
		this.setOverlay(bitmapDes, latLng, null);
	}

	/**
	 * 添加地图覆盖物
	 * 
	 * @param bitmapDes
	 * @param latLng
	 * @param info
	 */
	public void setOverlay(BitmapDescriptor bitmapDes, LatLng latLng,
			Bundle info) {
		OverlayOptions oOptinons = new MarkerOptions().position(latLng).icon(
				bitmapDes);

		if (mBaiduMap != null) {
			Marker marker = (Marker) mBaiduMap.addOverlay(oOptinons);
			// 传递数据
			if (info != null) {
				marker.setExtraInfo(info);
			}
		}
	}

	// #####################################################
	//
	// -------------------百度地图聚焦位置------------------
	//
	// #####################################################

	/**
	 * 屏幕中心点聚焦到指定地理位置
	 * 
	 * @param lat
	 * @param lng
	 */
	public void setNewLatLng(LatLng latLng) {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
			mBaiduMap.animateMapStatus(msu);
		}
	}

	// #####################################################
	//
	// -------------------百度地图视图模式------------------
	//
	// #####################################################

	/**
	 * 设置视图模式：普通视图
	 */
	public void setMapTypeToNormal() {
		if (mBaiduMap != null) {
			mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
		}
	}

	/**
	 * 设置视图模式：卫星视图
	 */
	public void setMapTypeToSatellite() {
		if (mBaiduMap != null) {
			mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
		}
	}

	/**
	 * 设置视图模式：开启/关闭实时交通图
	 * 
	 * @return boolean 返回当前开启状态
	 */
	public boolean setMapTypeToTraffic() {
		if (mBaiduMap != null) {
			if (mBaiduMap.isTrafficEnabled()) {
				mBaiduMap.setTrafficEnabled(false);
			} else {
				mBaiduMap.setTrafficEnabled(true);
			}
			return mBaiduMap.isTrafficEnabled();
		}
		return false;
	}

	// #################################################
	//
	// -------------------百度地图缩放------------------
	//
	// #################################################

	/**
	 * 设置地图缩放级别
	 * 
	 * @param amount
	 *            地图缩放级别增量
	 */
	public void setZoomTo(float amount) {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(amount);
			mBaiduMap.setMapStatus(msu);
		}
	}

	/**
	 * 根据给定增量缩放地图级别
	 * 
	 * @param amount
	 *            地图缩放级别增量
	 */
	public void setZoomBy(float amount) {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(amount);
			mBaiduMap.setMapStatus(msu);
		}
	}

	/**
	 * 根据给定增量以及给定的屏幕坐标缩放地图级别
	 * 
	 * @param amount
	 *            地图缩放级别增量
	 * @param focus
	 */
	public void setZoomBy(float amount, Point focus) {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(amount, focus);
			mBaiduMap.setMapStatus(msu);
		}
	}

	/**
	 * 放大地图缩放级别
	 */
	public void setZoomIn() {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomIn();
			mBaiduMap.setMapStatus(msu);
		}
	}

	/**
	 * 缩小地图缩放级别
	 */
	public void setZoomOut() {
		if (mBaiduMap != null) {
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomOut();
			mBaiduMap.setMapStatus(msu);
		}
	}

	// #####################################################
	//
	// -------------------百度地图生命周期------------------
	//
	// #####################################################

	/**
	 * 初始化百度地图SDK,放到setContentView()之前
	 * 
	 * @param appContext
	 *            上下文,使用ApplicationContext
	 */
	public static void initBaiduSDK(Context appContext) {
		SDKInitializer.initialize(appContext);
	}

	/**
	 * 生命周期,对应Activity生命周期onResume
	 */
	public void onResumeMap() {
		if (mBaiduMapView != null) {
			mBaiduMapView.onResume();
		}
	}

	/**
	 * 生命周期,对应Activity生命周期onPause
	 */
	public void onPauseMap() {
		if (mBaiduMapView != null) {
			mBaiduMapView.onPause();
		}
	}

	/**
	 * 生命周期,对应Activity生命周期onDestory
	 */
	public void onDestroyMap() {
		if (mBaiduMapView != null) {
			mBaiduMapView.onDestroy();
		}
	}

	/**
	 * 清空地图覆盖物
	 */
	public void clearMap() {
		if (mBaiduMap != null) {
			mBaiduMap.clear();
		}
	}
}
